package com.rongmei.jdsync.schedule;

import com.rongmei.jdsync.dto.sync.PriceSyncResult;
import com.rongmei.jdsync.dto.sync.RetryResult;
import com.rongmei.jdsync.service.PriceSyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Optional;

/**
 * 价格同步定时任务调度器
 *
 * @author dongjun
 */
@Component
@Slf4j
public class PriceSyncScheduler {

    @Autowired
    private PriceSyncService priceSyncService;

    /**
     * 价格同步定时任务
     * 每天晚上12点执行价格同步
     * 
     * cron表达式说明: "0 0 0 * * ?" 
     * - 秒: 0
     * - 分: 0  
     * - 时: 0 (晚上12点)
     * - 日: * (每天)
     * - 月: * (每月)
     * - 周: ? (不指定)
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void executePriceSyncTask() {
        log.info("=== 开始执行价格同步定时任务 ===");
        
        try {
            // 执行价格同步
            PriceSyncResult result = priceSyncService.executePriceSync();
            
            // 记录执行结果
            log.info("=== 价格同步定时任务执行完成 ===");
            log.info("同步结果: {}", result);
            
            // 如果有推送失败的商品，记录警告日志
            if (result.getPushFailedGoods() > 0) {
                log.warn("价格同步任务中有 {} 个商品推送失败，请检查日志", Optional.of(result.getPushFailedGoods()));
            }
            
        } catch (Exception e) {
            log.error("=== 价格同步定时任务执行失败 ===", e);
            // 这里可以添加告警通知，比如发送邮件、短信等
            sendAlertNotification("价格同步定时任务执行失败: " + e.getMessage());
        }
    }

    /**
     * 手动触发价格同步任务（用于测试）
     * 可以通过接口调用此方法进行手动同步
     */
    public PriceSyncResult manualPriceSync() {
        log.info("=== 手动触发价格同步任务 ===");
        try {
            PriceSyncResult result = priceSyncService.executePriceSync();
            log.info("手动价格同步完成: {}", result);
            return result;
            
        } catch (Exception e) {
            log.error("手动价格同步失败", e);
            throw new RuntimeException("手动价格同步失败: " + e.getMessage(), e);
        }
    }

    /**
     * 失败重试定时任务
     * 执行失败重试，处理前一天同步失败的商品
     *
     * 执行时间由配置文件中的 price-sync.retry-cron 控制
     */
    @Scheduled(cron = "${price-sync.retry-cron:0 0 1 * * ?}")
    public void executeRetryFailedSyncTask() {
        log.info("=== 开始执行失败重试定时任务 ===");

        try {
            // 执行失败重试，最大重试3次
            RetryResult retryResult = priceSyncService.retryFailedSync(3);
            // 记录执行结果
            log.info("=== 失败重试定时任务执行完成 ===");
            log.info("重试结果: {}", retryResult);
            // 如果还有重试失败的商品，发送告警
            if (retryResult.getRetryFailedCount() > 0) {
                String alertMessage = String.format("失败重试任务完成，但仍有 %d 个商品重试失败，需要人工处理", Integer.valueOf(retryResult.getRetryFailedCount()));
                sendAlertNotification(alertMessage);
            }
            // 如果重试成功了一些商品，记录成功信息
            if (retryResult.getRetrySuccessCount() > 0) {
                log.info("重试成功恢复了 {} 个商品的价格同步", Integer.valueOf(retryResult.getRetrySuccessCount()));
            }

        } catch (Exception e) {
            log.error("=== 失败重试定时任务执行失败 ===", e);
            sendAlertNotification("失败重试定时任务执行异常: " + e.getMessage());
        }
    }

    /**
     * 定期清理过期的同步日志
     * 执行时间由配置文件中的 price-sync.cleanup-cron 控制
     */
    @Scheduled(cron = "${price-sync.cleanup-cron:0 0 2 ? * SUN}")
    public void cleanupExpiredSyncLogs() {
        log.info("=== 开始执行同步日志清理任务 ===");

        try {
            // TODO: 实现日志清理逻辑
            // int cleanedCount = priceSyncService.cleanupExpiredLogs(30);
            // log.info("清理了 {} 条过期的同步日志", cleanedCount);

            log.info("同步日志清理任务暂未实现，跳过执行");

        } catch (Exception e) {
            log.error("=== 同步日志清理任务执行失败 ===", e);
            sendAlertNotification("同步日志清理任务执行异常: " + e.getMessage());
        }
    }


    /**
     * 发送告警通知
     *
     * @param message 告警消息
     */
    private void sendAlertNotification(String message) {
        // TODO: 实现告警通知逻辑
        // 可以集成邮件、短信等通知方式
        log.error("【告警通知】{}", message);
    }
}